import xlrd
import xlwt
import pandas as pd

def CreateList(filename, sheet_index=0, table_header_row=0):
    '''
    将ID_seq_score_a.xlsx中的数据转换为嵌套字典的列表
    :param filename: 文件名
    :param sheet_index: 表格号，默认为0
    :param table_header_row: 第一行的行号，默认为0
    :return: 返回生成的列表
    '''
    # 打开excel文件读取数据
    data = xlrd.open_workbook(filename)
    table = data.sheet_by_index(sheet_index)
    nrows = table.nrows
    nclos = table.ncols

    # 获取表头行的信息，为一个列表
    header_row_data = table.row_values(table_header_row)
    # 将每行的信息放入一个字典，再将字典放入一个列表中
    list = []
    for rownum in range(1, nrows):
        rowdata = table.row_values(rownum)
        # 如果rowdata有值，
        if rowdata:
            dict = {}
            for j in range(0, len(header_row_data)):
                # 将excel中的数据分别设置成键值对的形式
                dict[header_row_data[j]] = rowdata[j]
            list.append(dict)
    return list

def DataPreprc(list):
    '''
    :param list: 传入CreateList函数生成的列表
    :return: 返回将'ID'和'TIS-score'键对应的值做处理后的列表
    将'ID'对应的值取到小数点后一位
    将'TIS-score'对应的数据去掉中括号后变为数值类型
    '''
    for item in list:
        add = {'Titer-max-position': item['ID'][12:15]}
        item['ID'] = item['ID'][0:11]
        item['TIS-score'] = eval(item['TIS-score'][1:-1])
        item['TIS-MAX-location'] = item['TIS-location']
        item['TIS-MAX-score'] = item['TIS-score']
        item.update(add)
    return list

def GetRes(filename):
    '''
    :param list: 传入生成的列表
    :return: 返回结果列表
    '''
    list = sorted(DataPreprc(CreateList(filename)),
                  key=lambda x: x['TIS-score'], reverse=True)
    list = sorted(list, key=lambda y: y['ID'], reverse=False)
    result = []
    result.append(list[0])
    for dict in list:
        k = 0
        for item in result:
            if dict['ID'] != item['ID']:
                k = k + 1
            else:
                break
            if k == len(result):
                result.append(dict)
    return result

def OutputList(filname):
    '''
    :param list: 按指定格式输出结果
    :return:None
    '''
    list = GetRes(filename)
    for item in list:
        #print(item['ID'] + " 组最高得分者：\n" + 'ID:' + item['ID'] + '\tTIS-score:'
              #+ str(item['TIS-score']) + '\tTIS-location:' + str(item['TIS-location']))
        print(item)

def export_excel(filename):
    list = GetRes(filename)
    pf = pd.DataFrame(list)
    order = {'ID', ' Seq', 'TIS-location', 'if postis(正=Y)', 'TIS-score', 'TIS-MAX-location', 'TIS-MAX-score'}
    # 指定生成的Excel表格名称
    file_path = pd.ExcelWriter('D:\\result.xlsx')
    # 替换空单元格
    pf.fillna(' ', inplace=True)
    # 输出
    pf.to_excel(file_path, encoding='utf-8', index=False)
    # 保存表格
    file_path.save()
'''
主程序
'''
filename = 'D:\\ID_seq_score_a.xlsx'    # 想要测试该程序ID_seq_score_a.xlsx请将文件放在D盘根目录
#filename = 'D:\\test.xlsx'     # 可以只取少量数据作为测试文件
export_excel(filename)
#OutputList(filename)